home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / misc / prtfolio / sft.arj / SFT.I < prev    next >
Text File  |  1993-07-21  |  20KB  |  957 lines

  1. /***
  2.  
  3. SFT : serial file transfer for atari portfolio
  4.  
  5.   callin sequence: sft [baudrate]
  6.   terminal emulation * send file * receive file
  7.   compatible to bruce carbrey's tinyterm, ssend, sreceive
  8.  
  9.   r. henze  08.12.89  (transfer.s)
  10.   last edit 21.07.93
  11.  
  12.   19.07.93  Cnrtl-C/Cntrl/Break abgeschaltet (Funktion nobreak()
  13.             anwahl COM-Port ueber tmio_setup
  14.   11.06.92  Funktion redit (remote editing) eingeführt
  15.             nur für IBM-PC
  16.   09.04.92  send_com, get_com: uebertragung von cr:
  17.             (ibm-workstation rs6000 uebersetzt cr nach lf
  18.             im tastaturtreiber)
  19.             lf --> lf, lf
  20.             cr --> lf, ff
  21.   01.05.90  senden von hexfiles eingefuehrt
  22.   19.05.90  ver. 2.0: master/slave-version filetransfer, backup
  23.   01.08.90  ver. 3.0: serial port routines replaced by
  24.                       interrupt driven version: tmio.asm
  25.   05.10.90  ver. 3.1: machine specific routines extracted to files:
  26.                       sftata.c, sftibm.c
  27.   06.11.90  ver. 3.2: output to screen in hex code possible
  28.                       logging of incoming data
  29.   09.12.90          : blockwise file-write
  30.   08.07.91  ver. 3.3: optionale verzögerung in put_com (fuer lang-
  31.                       same empfänger ohne interrupt und puffer, cp/m)
  32. ***/
  33.  
  34. #define ibm   0
  35. #define atari 1
  36.  
  37. #define machine ibm     /* ibm, atari */
  38.  
  39. /*#define ptf*/   /*einschalten, falls für portfolio! */
  40.  
  41. /* ibm    : tmio assembler routines, interrupt driven,
  42.             for ibm:   link with : tmio_ibm.obj
  43.             portfolio: link with : tmio_ptf.obj
  44.             superchar: link with : tmio_spc.obj
  45. */
  46. /* ------------------------------------------------------------------------ */
  47.  
  48.  
  49. #if machine == ibm
  50. #include <dos.h>
  51. #include <conio.h>
  52. #include <bios.h>
  53. #include <dir.h>
  54. #include <io.h>
  55. #endif
  56.  
  57. #include <stdio.h>
  58. #include <stdlib.h>
  59. #include <fcntl.h>
  60.  
  61. #define f1   0xbb
  62. #define f2   0xbc
  63. #define f3   0xbd
  64. #define f4   0xbe
  65. #define f5   0xbf
  66. #define f6   0xc0
  67. #define f7   0xc1
  68. #define f8   0xc2
  69. #define f9   0xc3
  70. #define f10  0xc4
  71.  
  72. #define cf1  0xde
  73. #define cf2  0xdf
  74. #define cf3  0xe0
  75. #define cf4  0xe1
  76. #define cf5  0xe2
  77. #define cf6  0xe3
  78. #define cf7  0xe4
  79. #define cf8  0xe5
  80. #define cf9  0xe6
  81. #define cf10 0xe7
  82.  
  83. #define bufsz 0x400 /* buffer size = block size*/
  84. #define max_retry   5
  85.  
  86. #define ack 0x06    /* ascii ack = positive acknowlege*/
  87. #define nak 0x15
  88. #define esc 0x1b
  89. #define cr  0x0d
  90. #define lf  0x0a
  91. #define ff  0x0c
  92. #define eot 0x04
  93. #define xon 0x11    /*dl1*/
  94. #define xof 0x13    /*dl3*/
  95.  
  96. #define true  1
  97. #define false 0
  98. #define filnamlen 14  /* laenge filename incl. ext. und laufwerkskennung*/
  99.  
  100. int xoff_flg            ; /* ==1 : xoff was sent */
  101.  
  102. int  chr                ; /* character received*/
  103. unsigned char keydown   ; /* key pressed*/
  104. unsigned char line[80]  ; /* line buffer*/
  105. unsigned char bcheck    ; /* checksum transmitted*/
  106. unsigned char checksum  ; /* computed checksum*/
  107. unsigned char retry     ; /* retry counter*/
  108. unsigned char buf[bufsz]; /* buffer for received data*/
  109. unsigned char dummy;
  110. unsigned char hexflg;     /* ==true : hex output to screen */
  111. unsigned char logflg;     /* ==true : logging incoming data to file */
  112.  
  113. unsigned int blksz      ; /* transmitted block size*/
  114. unsigned int bnum       ; /* transmitted block #*/
  115. unsigned int blknum     ; /* current block sequence #*/
  116.  
  117. unsigned int delay      ; /* optional delay in put_com */
  118. unsigned int com_port   ; /* COM-port # (0,1) == COM1, COM2 */
  119.  
  120. int          speed      ; /* baudrate*/
  121. int          ser_stat   ; /* status serial port */
  122. int          cbuf_ful   ; /* flag serial port buffer full*/
  123. int i                   ; /* buffer index*/
  124. int file                ; /* file handle for output*/
  125. int scratch;
  126.  
  127. static int baudlist[]=
  128.   110,150,300,600,1200,2400,4800,9600,0
  129. ;
  130.  
  131. #ifndef ptf
  132. char *args[] = { "            ", "                                        ", NULL };
  133. unsigned char ediflg;
  134. unsigned char recflg;
  135. unsigned char scr[80];
  136. #endif
  137.  
  138. extern void nobreak();
  139. extern int get_ctc();
  140.  
  141. /* ------------------------------------------------------------------------ */
  142.  
  143. /*** Pre-references ***/
  144.  
  145. void quit(char* msg);
  146. unsigned char get_com_chk(unsigned char* csum);
  147. void put_com (unsigned char chr);
  148.  
  149. /*------------------------------------------------------------------------- */
  150. /* ----- error messages and string constants ------------------------------ */
  151. /*------------------------------------------------------------------------- */
  152.  
  153. #include <sftgmes.c>
  154.  
  155. /*------------------------------------------------------------------------- */
  156. /* ----- machine scpecific code ------------------------------------------- */
  157. /*------------------------------------------------------------------------- */
  158.  
  159. #if machine == atari
  160. #include <osbind.h>
  161. #include <sftata.c>
  162. #endif
  163.  
  164. /*------------------------------------------------------------------------- */
  165.  
  166. #if machine == ibm
  167. #include <sftibm.c>
  168. #endif
  169.  
  170. /*------------------------------------------------------------------------- */
  171. /* -----  end of machine scpecific code ----------------------------------- */
  172. /*------------------------------------------------------------------------- */
  173.  
  174. void getname(line)
  175. unsigned char *line;
  176. {
  177. int i;
  178. unsigned char c;
  179.  
  180. i=0;
  181. do
  182.   c = conin();
  183.   if (c == 0x08 && i>0)
  184.     conout(c);
  185.     i--;
  186.   else
  187.     if(i<filnamlen && c!= cr)
  188.       *(line+i) = c;
  189.       conout(c);
  190.       i++;
  191. while(c != 0x0d);
  192. *(line+i) = 0;
  193. conout(cr);
  194. conout(lf);
  195. }
  196.  
  197. /*----------------------------------------------------------------------------*/
  198.  
  199. /*ringpuffer-routinen*/
  200.  
  201. #define rbuflen 0x8000        /*pufferlaenge 32 kByte*/
  202.  
  203. unsigned char  rbuf[rbuflen]; /*puffer*/
  204. unsigned short staptr;        /*startpointer*/
  205. unsigned short endptr;        /*endpointer*/
  206. unsigned short chrnum;        /*aktuelle pufferlaenge*/
  207.  
  208. /*---------------------------------------*/
  209.  
  210. int tobuf(ib)
  211. unsigned char ib;
  212. {
  213. if (chrnum < rbuflen)        /*puffer nicht voll?*/
  214.   rbuf[endptr]=ib;
  215.   if (endptr < rbuflen-1)
  216.     endptr++;
  217.   else
  218.     endptr=0;
  219.   chrnum++;
  220.   return true;
  221. else                        /*puffer voll*/
  222.   logflg = false;
  223.   return false;
  224. }
  225.  
  226. /*---------------------------------------*/
  227.  
  228. int frombuf(ib)
  229.  
  230. unsigned char *ib;
  231. {
  232.  
  233. if (chrnum > 0)             /*puffer nicht leer?*/
  234.   *ib = rbuf[staptr];
  235.   if (staptr < rbuflen-1)
  236.     staptr++;
  237.   else
  238.     staptr=0;
  239.   chrnum--;
  240.   return true;
  241. else
  242.   return false;
  243. }
  244.  
  245. /*---------------------------------------*/
  246.  
  247. void bufini()
  248. {
  249. staptr=0;
  250. endptr=0;
  251. chrnum=0;
  252. }
  253.  
  254. /*---------------------------------------*/
  255.  
  256. void savebuf()
  257. {
  258. unsigned char ib;
  259. put(m_filename);
  260. getname(line);
  261. file = out_open(line);
  262. if (file != -1)
  263.   while (chrnum > 0)
  264.     if (frombuf(&ib))
  265.       write(file,&(unsigned char)ib,1);
  266.   close(file);
  267.   put(m_file);
  268.   put(line);
  269.   put(m_closed);
  270. }
  271.  
  272. /*---------------------------------------*/
  273.  
  274. void showbuf()
  275. {
  276. unsigned short wptr;
  277. unsigned short wnum;
  278. unsigned char ib;
  279.  
  280. wnum = chrnum;
  281. wptr = staptr;                /*staptr und chrnum retten*/
  282.  
  283. while(frombuf(&ib) || kbhit())
  284.   conout(ib);
  285.  
  286. chrnum = wnum;
  287. staptr = wptr;                /*staptr und chrnum restaurieren*/
  288. }
  289.  
  290. /*----------------------------------------------------------------------------*/
  291.  
  292. void quit(msg)
  293. char *msg;
  294. {
  295. exit_com();
  296. close(file);
  297. put(nl);
  298. put(msg);
  299. exit (1);
  300. }
  301.  
  302. /* ------------------------------------------------------------------------ */
  303.  
  304. void wait(delay)
  305. unsigned int delay;
  306.   unsigned int i;
  307.   unsigned int k;
  308.  
  309.   for (i=0; i<delay; i++)
  310.     k=i;
  311.   i=k;
  312.  
  313. /* ------------------------------------------------------------------------ */
  314.  
  315. /* display serial status*/
  316.  
  317. void show_port_error(message,i)
  318. unsigned char *message;
  319. int i;
  320. {
  321. put(nl);
  322. put(message);
  323. put(m_stat);
  324. hex(i);
  325. }
  326.  
  327. /* ------------------------------------------------------------------------ */
  328.  
  329. unsigned char get_com_chk(csum)
  330.  
  331. /* wait for byte from aux port.
  332.    return data byte.
  333.    tests for <esc> key on keyboard and